package com.thm.tfast.modules.sys.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.thm.tfast.core.sevruity.domain.SysUserDetails;
import com.thm.tfast.modules.sys.model.SysUser;
import com.baomidou.mybatisplus.extension.service.IService;
import com.thm.tfast.modules.sys.model.dto.user.*;
import com.thm.tfast.modules.sys.model.vo.user.CaptchaVo;
import com.thm.tfast.modules.sys.model.vo.user.UserInfoVo;

/**
 * <p>
 * 用户信息 服务类
 * </p>
 *
 * @author THM
 * @since 2022-10-10
 */
public interface SysUserService extends IService<SysUser> {

    /**
     * 根据用户名获取用户信息
     * @param username 用户名称
     * @return 用户信息
     */
    SysUser getUserByUsername(String username);
    /**
     * 获取用户信息
     * @param username 用户名称
     * @return 用户信息
     */
    SysUserDetails loadUserByUsername(String username);

    /**
     * 获取验证码信息
     * @return
     */
    CaptchaVo getCaptcha();
    /**
     * 登录返回token
     * @param dto 登录参数
     * @return 生成的JWT的token
     */
    String login(UserLoginDto dto);
    /**
     * 退出登录
     * @param username 用户名
     */
    void logout(String username);

    /**
     * 刷新token的功能
     * @param oldToken 旧的token
     */
    String refreshToken(String oldToken);

    /**
     * 获取当前登录用户信息
     * @return 用户信息
     */
    UserInfoVo getUserInfo();

    /**
     * 根据用户名或姓名分页获取用户列表
     * @param keyword 关键字：用户名、昵称
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 分页页码
     */
    Page<SysUser> page(String keyword,Integer pageNum,Integer pageSize);

    /**
     * 新增用户
     * @param dto 用户信息
     * @return 用户ID
     */
    Long insert(UserInsertDto dto);

    /**
     * 修改用户信息
     * @param dto 用户信息
     * @return true false
     */
    boolean update(UserUpdateDto dto);

    /**
     * 禁用或者启用用户
     * @param userId 用户ID
     * @return true false
     */
    boolean enableOrDisable(Long userId);

    /**
     * 重置用户密码
     * @param userId 用户ID
     * @return true false
     */
    boolean resetPassword(Long userId);

    /**
     * 修改用户密码
     * @param dto 密码参数
     * @return true false
     */
    boolean updatePassword(UserPasswordDto dto);

    /**
     * 删除用户
     * @param userId 用户ID
     * @return true false
     */
    boolean delete(Long userId);

    /**
     * 用户角色分配
     * @param dto 参数
     * @return true false
     */
    boolean allotRole(UserRoleDto dto);
}
